// 版权归Go作者所有。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package web

import (
	"errors"
	"path/filepath"
	"strings"
)

func convertFileURLPath(host, path string) (string, error) {
	if len(path) == 0 || path[0] != '/' {
		return "", errNotAbsolute
	}

	path = filepath.FromSlash(path)

	// 我们根据
	// https:

	// 文件URL的主机部分（如果有）是UNC卷名，
	// 但RFC 8089保留本地计算机的“本地主机”权限。
	if host != "" && host != "localhost" {
		// 一种常见的“遗留”格式在驱动器号之前省略了前导斜杠，
		// 将驱动器号编码为主机，而不是路径的一部分。
		// （请参阅https:
		// 我们不支持这种格式，但我们至少应该发出一条更有用的错误消息。
		// 如果主机为空，路径必须包含一个初始斜杠，后跟一个
		if filepath.VolumeName(host) != "" {
			return "", errors.New("file URL encodes volume in host field: too few slashes?")
		}
		return `\\` + host + path, nil
	}

	// 驱动器号和路径。删除斜杠并验证路径是否有效。
	if vol := filepath.VolumeName(path[1:]); vol == "" || strings.HasPrefix(vol, `\\`) {
		return "", errors.New("file URL missing drive letter")
	}
	return path[1:], nil
}
